package wili.attrMapping.core;

import java.io.File;
import java.util.List;
import java.util.Set;

import wili.attrMapping._user.b1.AttMapingRule_main;
import wili.c.Ca;

/**
 * 属性映射配置
 *
 * @author weila 2022年10月15日
 */
public interface UserConf {
	/*
	 * 功能：打印规则模板、生成规则表、fixMapping. 系统提供：AttsFileHandler. 用户实现：指定新旧文件集、属性定义、属性值类型解析,
	 * 解析给定的旧属性集~>新值。
	 */
	/**
	 * 
	 */
	boolean useNew = "asdf".isEmpty();
	//
	File DemoDIR = new File(Att9.AppDir, "/src/main/java/wili/attrMapping/demo");
	File RuleDir = new File(DemoDIR, "ruleTable");
	//
	boolean ShowRuleID = "asdf".isEmpty();
	boolean Debug = "".isEmpty();
	String DebugFile = "456".isEmpty() ? "logisticsTab.fragment.json" : "";
	String DebugGuid = "".isEmpty() ? "d92bd3ea-a81f-4e83-a9e8-ee3ef6016bbc" : "";

	/**
	 * @return Files may contains oldAtts.
	 */
	List<File> getOldFiles();

	/**
	 * @return 新属性或在的文件搜索范围。
	 */
	List<AttsFile> getNewAttsFiles();

	/**
	 * @param objName
	 * @return
	 */
	Atts createAtts(AttsFile afile, String key, Object obj, boolean isNewAtt);

	AttsDefine getAttsDefine();

	/**
	 * 取得新旧属性集在映射上的规则路径，插入规则表，返回规则表。<br>
	 * genRule时，根据旧值 vs 新值 ~> 规则值。生成规则值后，常需专家矫正。<br>
	 * 在创建的同时不断验证各个影射实例，若生成不同的规则值，即：“不一致的冲突” 简单的规则值是一个表达式，复杂的规则值是一个带函数的表达式。
	 */
	ValueMapingNode genRuleOf_oldNewAtts(boolean genRuleTemplate, Atts oldAtts, Atts newAtts,
			ValueMapingNode toLeafRule);
	// ValueMapingNode genRuleOfAtts2(boolean genRuleTemplate, AttsBean oldAtts,
	// AttsBean newAtts, ValueMapingNode toLeafRule);

	/**
	 * genRule时，根据旧值 vs 新值 ~> 规则值。生成规则值后，常需专家矫正。
	 */
	default ValueMapingNode genRulesOf_oldAttsList(boolean genRuleTemplate, List<Atts> oldAttsList,
			ValueMapingNode ruleRoot) {
		for (int i = 0; i < oldAttsList.size(); i++) {
			Atts oldAtts = oldAttsList.get(i);
			AttMapingRule_main.oldNum++;
			if (genRuleTemplate) {
				this.genRuleOf_oldNewAtts(genRuleTemplate, oldAtts, null, ruleRoot);
			} else {
				List<Atts> newAttsList = oldAtts.findNewAttsList();
				if (newAttsList.isEmpty())
					continue;
				for (int j = 0; j < newAttsList.size(); j++) {
					Atts newAtts = newAttsList.get(j);
					AttMapingRule_main.newNum++;
					this.genRuleOf_oldNewAtts(genRuleTemplate, oldAtts, newAtts, ruleRoot);
				}
			}
		}
		return ruleRoot;
	}

	/**
	 * 仅凭一对新旧属性集实例，来猜测构造映射规则。
	 */
	String genRuleOf_oldNewAtts(Atts oldAtts, Atts newAtts);

	/**
	 * 查找旧属性集
	 */
	List<Atts> findOldAttsList(AttsDefine def, AttsFile file);

	/**
	 * Find new atts list in new files (relates by old atts).
	 * 
	 * @return
	 */
	List<Atts> findNewAttsList(Atts oldAtts);

	/**
	 * 取得映射规则表（为刷新规则值）。
	 */
	default ValueMapingNode getMapingRule(ValueMapingNode rule, File file) {
		if (rule != null)
			return rule;
		if (rule == null || rule.lastModified < file.lastModified() || rule.fileLength != file.length()) {
			// 配置文件的热替换
			rule = ValueMapingNode.readFromFile(file);
			rule.lastModified = file.lastModified();
			rule.fileLength = file.length();
			Ca.log(1, "\n=========getMapingRule:" + file.getAbsolutePath());
			rule.print(1);
			Ca.log(1, "=========getMapingRule:end.");
		}
		return rule;
	}

	/**
	 * 取得映射规则表（为刷新规则值）。
	 */
	ValueMapingNode getMapingRule(ValueMapingNode rule);

	/**
	 * 写入文件之前对内容进行统一的替换处理。
	 */
	String replaceFileContent_atLast(String st);

	/**
	 * @return att file handler.
	 */
	AttsFile attsFileOf(Object fileOrFileSt);

	/**
	 * updateValue时， 根据规则，解析给定的旧属性集，解出其映射值: 顺着属性序列走向规则叶, 解析规则值, 设值到新属性。<br>
	 * ie. 旧值 vs 规则值 ~>新值
	 * 
	 * @param oldAtts
	 * @param toLeafRule
	 * @param newAtts
	 */
	void valueOfNewAtts(Atts oldAtts, ValueMapingNode toLeafRule, Atts newAtts);//parseOutNewAttValue_ofOldAtts

	/**
	 * 根据规则，解析每个旧属性集，解出其映射值。<br>
	 * 
	 * @return
	 */
	Set<AttsFile> valueOfNewAtts_inOldFile(boolean isCheck, AttsFile oldFile, AttsDefine attsDefine,
			ValueMapingNode ruleRoot, AttMapingRule_main cont);

	public static void ref() {
		// reference should be implemented by dev.
	}
}
